获取ContentResolver
1 |
|
这里的ApplicationCOntentResolver继承自ContentResolver,ContentResolver是一个抽象类。它是ContextImpl的内部类。
query
1 | //ContentResolver.java |
以CursorWrapperInner返回,它实现了Cursor接口。这里unstable和stable的区别在于,unstable的ContentProvider不会因为其远程服务进程的死亡而导致app被杀掉,而stable会。
1 | //ContentResolver.java |
这里acquireUnstableProvider是个抽象方法,那么应该在其子类ApplicationContentResolver中实现。
1 | //ApplicationContentResolver.java |
这里我们可以看到它ICP先试通过acquireExistingProvider来获取,如果取到就直接返回,否则就需要通过AMS的getContentProvider来取到的,它返回一个IActivityManager.ContentProviderHolder成员holder,其中的provider就是ICP的binder代理接口。那么acquireExistingProvider大概就是从缓存里取吧。
1 | //ActivityThread.java |
其中mProviderMap中记录的是本进程的ContentProvider,它再应用启动时候就进行了初始化,这样如果是当前应用使用自身的ContentProvider,就不需要再去AMS中查找了,直接从这里就可以取到。
1 | //ActivityManagerService.java |
Provoider的install流程
1 | public void handleInstallProvider(ProviderInfo info) { |
1 | // ActivityThread.java |
该过程主要创建ContentProvider实例
1 | //ActivityManagerService.java |